package com.zhentao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zhentao.mapper.WmUserMapper;
import com.zhentao.model.dtos.ResponseResult;
import com.zhentao.model.enums.AppHttpCodeEnum;
import com.zhentao.model.wemedia.dto.WmLoginDto;
import com.zhentao.model.wemedia.pojo.WmUser;
import com.zhentao.service.WmUserService;
import com.zhentao.utils.common.AppJwtUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

@Service
public class WmUserServiceImpl implements WmUserService {
    @Autowired
    private WmUserMapper wmUserMapper;

    /**
     * 自媒体端登录
     * @param dto 自媒体段登录 用户信息  包含账号密码
     * @return
     */
    @Override
    public ResponseResult login(WmLoginDto dto) {
        //参数校验  自媒体用户登录 账号  密码 非空判断
        if(StringUtils.isBlank(dto.getName()) || StringUtils.isBlank(dto.getPassword())){
            //数据不存在
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "账号或密码为空!");
        }
        //根据自媒体用户账号 查询 用户信息
        QueryWrapper<WmUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(WmUser::getName, dto.getName());
        WmUser wmUser = wmUserMapper.selectOne(queryWrapper);
        //判断是否为空
        if(wmUser == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"账号不存在!");
        }
        //密码校验
        //盐（Salt）:
        //salt 是从 wmUser 对象中获取的一个字符串，它用于在加密密码时增加随机性，避免两个相同密码的用户生成相同的哈希值。
        //这样做是为了防止暴力破解、彩虹表攻击等。
        //盐的目的是增加密码存储的安全性，通常盐应该是随机生成并与用户账户相关联。
        String salt = wmUser.getSalt();

        //MD5 哈希算法:
        //DigestUtils.md5DigestAsHex(...) 是 Spring 框架中的工具方法，用于计算输入字符串的 MD5 哈希值，并将其转换为十六进制字符串。
        //在这里，原始密码和盐的组合通过 MD5 哈希算法进行加密，生成一个固定长度（32个字符）的哈希值。
        //StandardCharsets.UTF_8 确保了在字节转换时使用 UTF-8 编码。
        String password = DigestUtils.md5DigestAsHex((dto.getPassword() + salt).getBytes(StandardCharsets.UTF_8));
        if(password.equals(wmUser.getPassword())){
            //密码校验完成 密码正确  登录成功
            //返回token
            String token = AppJwtUtil.getToken(wmUser.getId().longValue());
            Map<String,Object> map = new HashMap<>();
            map.put("token", token);
            //密码和盐并不相应给前端
            wmUser.setPassword(null);
            wmUser.setSalt(null);
            //将自媒体用户信息也相应给前端
            map.put("user", wmUser);
            return ResponseResult.okResult(map);
        }else {
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR,"密码错误!");
        }
    }
}




















